/**
 * 定义结点
 */
#ifndef DATA_STRUCTURE_OPTION_CONFIG_H
#define DATA_STRUCTURE_OPTION_CONFIG_H

#include "common.h"

#define ElemType int

/**
 * 判断枚举
 */
typedef enum
{
    FALSE = 0,
    TRUE = 1
} bool;

/**
 * 线性表定义
 */
#define NODE (Node *) malloc(sizeof(Node)) //单链表动态分配
#define DNODE (DNode *) malloc(sizeof(DNode)) //双向链表动态分配空间
#define SEQ_STACK_LEN (ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SIZE)
#define LINK_STACK_LEN (StackNode *)malloc(sizeof(StackNode))

/**
 * 栈定义
 */
#define STACK_INIT_SIZE 8 //栈初始化大小
#define STACK_INC_SIZE 3  //栈增量的大小

/*******************************************************************************************
 *  线性表定义
 *******************************************************************************************/
/**
 * 顺序表结点
 */
typedef struct SeqList
{
    ElemType *base;  //开辟的基准空间(开辟空间)
    int capacity;  //容量
    int size;  //表的大小（长度)
} SeqList;

/**
 * 单链表结点
 */
typedef struct Node
{
    ElemType data; //数据域
    struct Node *next; //指针域，存储下一个结点的指针
} Node, *pNode;

/**
 * 单链表管理列表
 */
typedef struct List
{
    pNode first;  //指向头结点
    pNode last;  //指向尾结点
    size_t size; //记录有效结点数
} List;

/**
 * 定义双向链表结点
 */
typedef struct DNode
{
    ElemType data;              /*存储本身的数据*/
    struct DNode *prio;         /*存储前驱节点的地址*/
    struct DNode *next;         /*存储后继节点的地址*/
} DNode, *PDNode;

/**
 * 定义双向链表管理列表
 */
typedef struct DList
{
    PDNode first;               /*指向头节点 */
    PDNode last;                /*指向尾节点 */
    int size;                   /*有效节点的个数*/
} DList;

/**
 * 获取结点
 * @param x
 * @return
 */
Node *_buynode(ElemType x);

/**
 * 获取双向结点
 * @param x
 * @return
 */
DNode *_buyDNode(ElemType x);


/*******************************************************************************************
 *  栈定义
 *******************************************************************************************/
/**
 * 栈节点定义
 */
typedef struct SeqStack
{
    ElemType *base;            /*栈的基本地址 指向栈的空间*/
    int capacity;              /*栈的最大容量*/
    int top;                   /*指向栈顶的位置(可表示栈内元素个数)*/
} SeqStack;

/**
 * 链栈
 */
typedef struct StackNode
{
    ElemType data;              /*数据域*/
    struct StackNode *next;     /*指针域*/
} StackNode;

typedef StackNode *LinkStack;

/*******************************************************************************************
 *  队列定义
 *******************************************************************************************/

#define QUEUE_MAXSIZE 9
#define QUEUE_LEN (ElemType *)malloc(sizeof(ElemType)*QUEUE_MAXSIZE)
#define LINK_QUEUE_LEN (QueueNode *)malloc(sizeof(QueueNode))

/**
 * 定义队列节点
 */
typedef struct Queue
{
    ElemType *base;             /*指向队列的存储空间*/
    int front;                  /*指向队头*/
    int rear;                   /*指向队尾*/
} Queue;

/**
 * 定义链节点
 */
typedef struct QueueNode
{
    ElemType data;              /*数据域*/
    struct QueueNode *next;     /*指针域*/
} QueueNode;

/**
 * 定义链队列管理列表
 */
typedef struct LinkQueue
{
    QueueNode *front;          /*队头指针*/
    QueueNode *tail;           /*队尾指针*/
} LinkQueue;

#endif //DATA_STRUCTURE_OPTION_CONFIG_H
